const { app, BrowserWindow } = require('electron/main')
const electron = require('electron')
const { net } = require('electron');

const path = require('node:path')
const { spawn } = require('child_process');
let javaProcess; // 用于存储Java进程的引用
const fs = require('fs');
const logFileName = 'app.log';
const appPath = app.getAppPath();
console.log("this appPat is "+appPath);
let dirName = `D:\\admin`;
const logFilePath = `${dirName}\\${logFileName}`;
let win;
function createWindow () {
  win = new BrowserWindow({
    fullscreen:true,
	transparent: true,
	menu:null,
    webPreferences: {
      // preload: path.join(__dirname, 'preload.js')
    }
  })

  win.loadFile('login.html')
win.setMenuBarVisibility(false); // 隐藏菜单栏
  writeLogToFile(dirName)
win.setIcon(dirName+'\\bitbug_favicon.ico');
  win.webContents.executeJavaScript('showLoad()');
/***
   * 关闭窗口前提示确认信息
   */
  win.on('close', (e) => {
    e.preventDefault()//阻止默认行为，一定要有
    electron.dialog.showMessageBox({
      type: 'info',
      title: '关闭提示',
      cancelId:2,
      defaultId: 0,
      message: '确定要退出吗？',
      buttons: ['最小化','直接退出']
    }).then(result => {
      if (result.response == 0) {
        e.preventDefault();		//阻止默认行为，一定要有
        win.minimize();	//调用 最小化实例方法
      } else if(result.response == 1) {
        win = null;
		 if (javaProcess) {
			javaProcess.kill(); // 或者 javaProcess.kill('SIGINT') 来优雅地关闭
		}
        //app.quit();	//不要用quit();试了会弹两次
        app.exit();		//exit()直接关闭客户端，不会执行quit();
      }
    }).catch(err => {
      console.log(err)
    })
  });



}

function checkEndpoint() {
  return new Promise((resolve) => {
    let timeoutFired = false;
    const request = net.request({
      url: 'https://jzfch.jinzaifood.com.cn:6178',
      method: 'HEAD',
      certificate: { rejectUnauthorized: false }
    });

    // 严格计时器
    const timeout = setTimeout(() => {
      timeoutFired = true;
      console.log('严格执行10秒超时');
      request.abort();
      resolve(false);
    }, 10000);

    request.on('response', (response) => {
      if (timeoutFired) return;
      clearTimeout(timeout);
      console.log('有效响应:', response.statusCode);
      resolve(response.statusCode === 200);
      request.abort();
    });

    request.on('error', (error) => {
      if (timeoutFired) return;
      clearTimeout(timeout);
      console.log('请求错误:', error);
      resolve(false);
    });

    request.on('abort', () => {
      if (!timeoutFired) {
        console.log('请求被意外终止');
        resolve(false);
      }
    });

    request.end();
  });
}

function writeLogToFile(message) {
  fs.appendFile(logFilePath, `${new Date().toISOString()} - ${message}\n`, (err) => {
    if (err) {
      console.error('Error writing log to file:', err);
    }
  });
}
function startJavaBackend() {
  let jarToStart;
  try {
    // 1. 读取 dirName 目录中的所有文件
    const files = fs.readdirSync(dirName);

    // 2. 过滤出 'admin' 开头、'.jar' 结尾的文件，并获取它们的创建时间
    const jarFiles = files
        .filter(file => file.startsWith('admin') && file.endsWith('.jar'))
        .map(file => {
          const filePath = path.join(dirName, file);
          try {
            // 3. 获取文件状态（包含时间戳）
            const stats = fs.statSync(filePath);
            return {
              name: file,
              path: filePath,
              time: stats.birthtimeMs // 'birthtimeMs' 是文件的创建时间
            };
          } catch (statErr) {
            console.error(`无法获取文件状态 ${filePath}: ${statErr}`);
            writeLogToFile(`无法获取文件状态 ${filePath}: ${statErr}`);
            return null; // 如果获取状态失败，则忽略此文件
          }
        })
        .filter(file => file !== null); // 过滤掉获取状态失败的文件

    // 4. 检查是否找到了
    if (jarFiles.length === 0) {
      console.error(`在 ${dirName} 目录中未找到 admin*.jar 文件。`);
      writeLogToFile(`在 ${dirName} 目录中未找到 admin*.jar 文件。`);
      // 显示错误提示并退出
      electron.dialog.showMessageBox({
        type: 'error',
        title: '启动错误',
        message: `在 ${dirName} 目录中未找到 admin*.jar 文件。\n请联系信息部胥维：18908401933`,
        buttons: ['退出']
      }).then(() => {
        app.exit();
      });
      return; // 停止执行此函数
    }

    // 5. 按创建时间降序排序（最新的在最前面）
    jarFiles.sort((a, b) => b.time - a.time);

    // 6. 获取最新的 jar 文件路径
    const latestJar = jarFiles[0];
    jarToStart = latestJar.path; // 这是完整的路径，例如 'D:\admin\admin-1.1.jar'

    console.log(`找到最新的 JAR: ${jarToStart}`);
    writeLogToFile(`准备启动最新的 JAR: ${jarToStart}`);

  } catch (err) {
    console.error(`查找 JAR 文件时出错: ${err}`);
    writeLogToFile(`查找 JAR 文件时出错: ${err}`);
    // 显示错误提示并退出
    electron.dialog.showMessageBox({
      type: 'error',
      title: '启动错误',
      message: `查找 admin*.jar 文件时出错: ${err.message}\n请联系信息部胥维：18908401933`,
      buttons: ['退出']
    }).then(() => {
      app.exit();
    });
    return; // 停止执行此函数
  }

  // 7. 启动Java后台进程，使用找到的最新 jarToStart 路径
  javaProcess = spawn('java', ['-jar', jarToStart], {
    // 显式指定编码
    encoding: 'utf8'
  });

  javaProcess.stdout.on('data', (data) => {
    let str = `${data}`;
    console.log(`Java Backend Output: ${data}`);
    if(data.includes ('startok')){
      win.webContents.executeJavaScript('layer.closeAll()');
    }
  });

  javaProcess.stderr.on('data', (data) => {
    console.error(`Java Backend Error: ${data}`);
  });

  javaProcess.on('close', (code) => {
    console.log(`Java Backend exited with code ${code}`);
  });

  javaProcess.on('error', (error) => {
    console.error(`Failed to start Java Backend: ${error}`);
    writeLogToFile(`Failed to start Java Backend: ${error}`);
    // 启动失败也提示用户
    electron.dialog.showMessageBox({
      type: 'error',
      title: '启动失败',
      message: `启动 Java 进程失败: ${error.message}\n请联系信息部胥维：18908401933`,
      buttons: ['退出']
    }).then(() => {
      app.exit();
    });
  });
}
app.whenReady().then(() => {
  createWindow();
  checkEndpoint().then((isAvailable) => {
    console.error('start check network '+isAvailable);
    if (isAvailable) {
      startJavaBackend();
    } else {
      electron.dialog.showMessageBox({
        type: 'error',
        title: '网络',
        cancelId:0,
        defaultId: 0,
        message: '当前检测到无网络,请联系信息部胥维：18908401933',
        buttons: ['好的']
      }).then(result=>{
        if (javaProcess) {
          javaProcess.kill(); // 或者 javaProcess.kill('SIGINT') 来优雅地关闭
        }
        app.exit()
      }).catch(err=>{
        console.log(err);
      })
    }
  });

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})
// 监听Electron退出事件
app.on('will-quit', () => {
  // 终止Java进程
  if (javaProcess) {
    javaProcess.kill(); // 或者 javaProcess.kill('SIGINT') 来优雅地关闭
  }
});
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
  if (javaProcess) {
    javaProcess.kill(); // 或者 javaProcess.kill('SIGINT') 来优雅地关闭
  }
})
